module Counter #(
    parameter MAX_VAL = 999      // 最大计数值参数化
)(
    input  logic sys_clk,           // 主时钟
    input  logic rst,           // 异步复位
    input  logic s1, s2, s3,    // 控制按钮（低有效）
    output logic isRunning_Out, // 运行状态
    output logic [4:0] ge,      // 个位（0-9）
    output logic [4:0] shi,     // 十位
    output logic [4:0] bai      // 百位
);

// 寄存器声明
logic [2:0] btn_prev;           // 按钮历史状态（s1,s2,s3）
logic [9:0] value;              // 10bit足够存储0-999
logic isRunning;

// 组合逻辑输出
assign isRunning_Out = isRunning;

// 同步边沿检测（正边沿）
logic s1_rise, s2_rise, s3_rise;
always_comb begin
    s1_rise = ~btn_prev[0] & s1;  // s1上升沿
    s2_rise = ~btn_prev[1] & s2;  // s2上升沿
    s3_rise = ~btn_prev[2] & s3;  // s3上升沿
end

// 主状态机
always_ff @(posedge sys_clk or posedge rst) begin
    if (rst) begin
        // 复位初始化
        btn_prev <= 3'b111;       // 默认按钮释放状态（假设低有效）
        isRunning <= 1'b1;       // 默认启动状态
        value <= 10'b0;
    end else begin
        // 记录按钮历史状态
        btn_prev <= {s3, s2, s1}; // 注意顺序调整
        
        // 运行状态切换（s1控制）
        if (s1_rise) isRunning <= ~isRunning;
        
        // 计数器增减控制
        case ({isRunning, s2_rise, s3_rise})
            3'b1_1_0: begin  // 运行状态下s2有效
                value <= (value < MAX_VAL) ? value + 1 : MAX_VAL;
            end
            3'b0_0_1: begin  // 停止状态下s3有效
                value <= (value > 0) ? value - 1 : 0;
            end
            default: ;       // 保持当前值
        endcase
    end
end

// 数值解码（组合逻辑）
assign ge  = value % 10;
assign shi = (value / 10) % 10;
assign bai = (value / 100) % 10;

endmodule